#ifndef XML_SHAPEPRO_H_
#define XML_SHAPEPRO_H_
#include <iostream>
#include <string>
#include <vector>
using namespace std;

#define Interface struct

class TransForm2D
{
public:
      TransForm2D();
      TransForm2D(const TransForm2D& trans2d);
      int GetX() const;
      void SetX(int x);
      int GetY() const;
      void SetY(int y);
      int GetCX() const;
      void SetCX(int wide);
      int GetCY() const;
      void SetCY(int high);

private:
      int m_x_;
      int m_y_;
      int m_cx_;
      int m_cy_;
};

class PrstGeometry2D
{
public:
      PrstGeometry2D();
      PrstGeometry2D(const PrstGeometry2D& prst2d);
      string GetPrstGeometry2D();
      void SetPrstGeometry2D(string prst);
      string GetPrstGeometry2D_prst();
      void SetPrstGeometry2D_prst(string prst);
      string GetPrstGeometry2D_name();
      void SetPrstGeometry2D_name(string name);
      string GetPrstGeometry2D_fmla();
      void SetPrstGeometry2D_fmla(string fmla);

private:
      string m_prst_;
      string gd_name;
      string gd_fmla;
};

class SolidFill
{
public:
      SolidFill();
      SolidFill(const SolidFill& fill);
      string GetFill();
      void SetFill(string val);

private:
      string m_val_;
};

class LineType
{
public:
      LineType();
      LineType(const LineType& linetype);
      string GetLineType();
      void SetLineType(string linetype);

private:
      string m_linetype_;
};

Interface IKShapeBasePro 
{
     virtual TransForm2D GetTrans2d() const = 0;
     virtual void SetTrans2d(TransForm2D trans2d) = 0;
     virtual PrstGeometry2D GetPrst2d() const = 0;
     virtual void SetPrst2d(PrstGeometry2D prst2d) = 0;
     virtual SolidFill GetFill() const = 0;
     virtual void SetFill(SolidFill fill) = 0;
     virtual LineType GetLine() const = 0;
     virtual void SetLine(LineType line) = 0;
};

class ShapePro:public IKShapeBasePro
{
public:
    virtual TransForm2D GetTrans2d() const;
    virtual void SetTrans2d(TransForm2D trans2d);
    virtual PrstGeometry2D GetPrst2d() const;
    virtual void SetPrst2d(PrstGeometry2D prst2d);
    virtual SolidFill GetFill() const;
    virtual void SetFill(SolidFill fill);
    virtual LineType GetLine() const;
    virtual void SetLine(LineType line);

private:
    TransForm2D m_trans_2d_;
    PrstGeometry2D m_prst_2d_;
    SolidFill m_solid_fill_;
    LineType m_line_type_;
};

#endif
